package com.sanjiayi.controller;

import com.sanjiayi.config.QiniuConfig;
import com.sanjiayi.result.Result;
import com.sanjiayi.utils.QiniuUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Slf4j
@RestController
@RequestMapping("/file")
@Api(tags = "文件上传接口")
public class FileController {

    @Autowired
    private QiniuUtils qiniuUtils;

    @Autowired
    private QiniuConfig qiniuConfig;

    @PostMapping("/upload/image")
    @ApiOperation("上传图片")
    public Result uploadImage(@RequestParam("files") MultipartFile[] files) {
        log.info("开始处理图片上传请求，文件数量: {}", files != null ? files.length : 0);
        
        if (files == null || files.length == 0) {
            log.warn("未选择任何图片文件");
            return Result.error("请选择要上传的图片");
        }

        List<String> imageUrls = new ArrayList<>();
        List<String> failedFiles = new ArrayList<>();
        
        for (MultipartFile file : files) {
            try {
                log.info("处理文件: {}, 大小: {} bytes, 类型: {}", 
                        file.getOriginalFilename(), file.getSize(), file.getContentType());
                
                // 检查文件类型
                String contentType = file.getContentType();
                if (contentType == null || !contentType.startsWith("image/")) {
                    log.warn("文件类型不正确: {}, contentType: {}", file.getOriginalFilename(), contentType);
                    failedFiles.add(file.getOriginalFilename() + "(不是图片文件)");
                    continue;
                }

                // 检查文件大小（限制为10MB）
                if (file.getSize() > 10 * 1024 * 1024) {
                    log.warn("文件大小超限: {}, size: {} bytes", file.getOriginalFilename(), file.getSize());
                    failedFiles.add(file.getOriginalFilename() + "(超过10MB)");
                    continue;
                }

                String fileName = UUID.randomUUID().toString().replaceAll("-", "") + 
                        getFileExtension(file.getOriginalFilename());
                String key = "images/" + fileName;
                
                log.info("开始上传文件到七牛云: {}", key);
                boolean success = qiniuUtils.upload(file.getBytes(), key);
                
                if (success) {
                    String url = qiniuConfig.getDomain() + "/" + key;
                    log.info("文件上传成功: {}", url);
                    imageUrls.add(url);
                } else {
                    log.error("文件上传失败: {}", file.getOriginalFilename());
                    failedFiles.add(file.getOriginalFilename());
                }
            } catch (IOException e) {
                log.error("文件处理异常: {}", file.getOriginalFilename(), e);
                failedFiles.add(file.getOriginalFilename());
            }
        }
        
        if (!failedFiles.isEmpty()) {
            String message;
            if (imageUrls.isEmpty()) {
                message = "所有图片上传失败: " + String.join(", ", failedFiles);
                log.error(message);
                return Result.error(message);
            } else {
                message = "部分图片上传失败: " + String.join(", ", failedFiles) + 
                        "，成功上传: " + imageUrls.size() + "张";
                log.warn(message);
                return Result.error(message);
            }
        }

        log.info("所有图片上传成功，共 {} 张", imageUrls.size());
        return Result.ok(imageUrls);
    }

    @PostMapping("/upload/video")
    @ApiOperation("上传视频")
    public Result uploadVideo(@RequestParam("file") MultipartFile file) {
        log.info("开始处理视频上传请求: {}", file != null ? file.getOriginalFilename() : "null");
        
        if (file == null || file.isEmpty()) {
            log.warn("未选择视频文件");
            return Result.error("请选择要上传的视频");
        }

        try {
            log.info("处理文件: {}, 大小: {} bytes, 类型: {}", 
                    file.getOriginalFilename(), file.getSize(), file.getContentType());
            
            // 检查文件类型
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("video/")) {
                log.warn("文件类型不正确: {}, contentType: {}", file.getOriginalFilename(), contentType);
                return Result.error("请上传正确的视频格式");
            }
            
            // 检查文件大小（限制为100MB）
            if (file.getSize() > 100 * 1024 * 1024) {
                log.warn("文件大小超限: {}, size: {} bytes", file.getOriginalFilename(), file.getSize());
                return Result.error("视频大小不能超过100MB");
            }

            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + 
                    getFileExtension(file.getOriginalFilename());
            String key = "videos/" + fileName;
            
            log.info("开始上传文件到七牛云: {}", key);
            boolean success = qiniuUtils.upload(file.getBytes(), key);
            
            if (success) {
                String url = qiniuConfig.getDomain() + "/" + key;
                log.info("视频上传成功: {}", url);
                return Result.ok(url);
            } else {
                log.error("视频上传失败: {}", file.getOriginalFilename());
                return Result.error("视频上传失败，请重试");
            }
        } catch (IOException e) {
            log.error("视频处理异常: {}", file.getOriginalFilename(), e);
            return Result.error("视频上传失败: " + e.getMessage());
        }
    }

    private String getFileExtension(String filename) {
        if (filename == null || filename.lastIndexOf(".") == -1) {
            return "";
        }
        return filename.substring(filename.lastIndexOf("."));
    }
} 